/*
  @Description:  只封装基本的增删查改,复杂的不予封装
*/
package sqltemplate

import (
	"database/sql"
	"strconv"
	"time"
)

//创建连接池
func NewConnPool(config *ConnPoolConfig) (*sql.DB, error) {

	dataSourceName := config.Username + ":" + config.Password + "@tcp(" + config.Ip + ":" + strconv.Itoa(config.Port) + ")/" + config.DbName
	conn, err := sql.Open("mysql", dataSourceName)
	if err != nil {
		return nil, err
	}
	//设置连接池
	conn.SetMaxOpenConns(100)
	conn.SetMaxIdleConns(10)
	conn.SetConnMaxLifetime(10 * time.Minute)
	return conn, conn.Ping()
}

func NewSqlTemplate(config *ConnPoolConfig) (*SqlTemplate, error) {
	db, err := NewConnPool(config)
	if nil != err {
		return nil, err
	}

	return &SqlTemplate{
		db: db,
	}, nil
}

/*
 核心对象
*/
type SqlTemplate struct {
	db  *sql.DB
	err error
}

//获取原生的sql包的DB对象，如有使用原生api需求可以调此方法
func (st *SqlTemplate) DB() *sql.DB {
	return st.db
}

func (st *SqlTemplate) BeginTX() (*TX, error) {
	tx, err := st.db.Begin()
	if nil != err {
		return nil, err
	}

	return &TX{
		tx0: tx,
	}, nil

}
